home *** CD-ROM | disk | FTP | other *** search
- ; TRAVERSE
- ; Benchmark to create once and traverse a Structure
-
- (defstruct node
- (parents ())
- (sons ())
- (sn (snb))
- (entry1 ())
- (entry2 ())
- (entry3 ())
- (entry4 ())
- (entry5 ())
- (entry6 ())
- (mark ()))
-
- (defvar sn 0)
- (defvar rand 21.)
- (defvar count 0)
- (defvar marker nil)
- (defvar root)
-
- (defun snb () (setq sn (1+ sn)))
-
- (defun seed () (setq rand 21.))
-
- (defun traverse-random () (setq rand (mod (* rand 17.) 251.)))
-
- (defun traverse-remove (n q)
- (cond ((eq (cdr (car q)) (car q))
- (prog2 () (caar q) (rplaca q ())))
- ((= n 0)
- (prog2 () (caar q)
- (do ((p (car q) (cdr p)))
- ((eq (cdr p) (car q))
- (rplaca q
- (rplacd p (cdr (car q))))))))
- (t (do ((n n (1- n))
- (q (car q) (cdr q))
- (p (cdr (car q)) (cdr p)))
- ((= n 0) (prog2 () (car q) (rplacd q p)))))))
-
- (defun traverse-select (n q)
- (do ((n n (1- n))
- (q (car q) (cdr q)))
- ((= n 0) (car q))))
-
- (defun add (a q)
- (cond ((null q)
- `(,(let ((x `(,a)))
- (rplacd x x) x)))
- ((null (car q))
- (let ((x `(,a)))
- (rplacd x x)
- (rplaca q x)))
- (t (rplaca q
- (rplacd (car q) `(,a .,(cdr (car q))))))))
-
- (defun create-structure (n)
- (let ((a `(,(make-node))))
- (do ((m (1- n) (1- m))
- (p a))
- ((= m 0) (setq a `(,(rplacd p a)))
- (do ((unused a)
- (used (add (traverse-remove 0 a) ()))
- (x) (y))
- ((null (car unused))
- (find-root (traverse-select 0 used) n))
- (setq x (traverse-remove (rem (traverse-random) n) unused))
- (setq y (traverse-select (rem (traverse-random) n) used))
- (add x used)
- (setf (node-sons y) `(,x .,(node-sons y)))
- (setf (node-parents x) `(,y .,(node-parents x))) ))
- (push (make-node) a))))
-
- (defun find-root (node n)
- (do ((n n (1- n)))
- ((= n 0) node)
- (cond ((null (node-parents node))
- (return node))
- (t (setq node (car (node-parents node)))))))
-
- (defun travers (node mark)
- (cond ((eq (node-mark node) mark) ())
- (t (setf (node-mark node) mark)
- (setq count (1+ count))
- (setf (node-entry1 node) (not (node-entry1 node)))
- (setf (node-entry2 node) (not (node-entry2 node)))
- (setf (node-entry3 node) (not (node-entry3 node)))
- (setf (node-entry4 node) (not (node-entry4 node)))
- (setf (node-entry5 node) (not (node-entry5 node)))
- (setf (node-entry6 node) (not (node-entry6 node)))
- (do ((sons (node-sons node) (cdr sons)))
- ((null sons) ())
- (travers (car sons) mark)))))
-
- (defun traverse (root)
- (let ((count 0))
- (travers root (setq marker (not marker)))
- count))
-
- (qa-attempt "Traverse init" (setq root (create-structure 100.)) nil)
-
- (qa-attempt "Traverse"
- (do ((i 50. (1- i)))
- ((= i 0))
- (traverse root)
- (traverse root)
- (traverse root)
- (traverse root)
- (traverse root))
- nil)
-
- (define-timer traverse "Traverse, Traverse"
- (do ((i 50. (1- i)))
- ((= i 0))
- (traverse root)
- (traverse root)
- (traverse root)
- (traverse root)
- (traverse root)))
-
- (define-timer traverse-init "Traverse, Initialize"
- (prog2 (setq root (create-structure 100.)) ()))